#include <iomanip>
#include <iostream>
using namespace std;

int main() {
  int *f(); // 函数声明。不占用空间
  int *f(); // 兼容的声明可以多次。如果是定义则不能重复。
  cout << f << endl; // f代表函数地址，隐式转换为bool型。
  cout << boolalpha << f << endl; // 要求bool型按文字输出（true/false）
  cout << &f << endl; // 和仅写f效果相同
  cout << (void *)f << endl; // 强制转为void*后，ostream有对应的重载输出函数
  cout << (*f)() << endl; // 啰嗦的函数调用
  cout << f() << endl; // 正常函数调用
  cout << *f() << endl; // 对函数返回的地址值“解引用”
  cout << &*f() << endl; // 对“引用”再次取址
  int i = 9;
  cout << *&i << endl;
  cout << *&*&*&i << endl; // 无聊但允许
  // cout << &(int)i << endl; // 错误，临时值不能取地址
  int* p; // 整型指针
  int (*fp)(); // 函数指针，目标应当是返回int的无参函数
  int (*ap)[5]; // 指向特定长度整型数组的指针
  int a5[5], a7[7];
  // ap = a5; // 错误：数组名隐式转为int*，丢失了长度信息
  ap = &a5; // 允许
  // ap = &a7; // 错误：长度不同，不允许赋值
}

int *f() { // 定义了名叫f的函数，但前面的main看不到定义，需要声明。
  static int x = 123; // 静态变量在函数返回后仍存在。
  return &x; // 返回非静态局部变量的地址是极其错误的。
}
